package br.com.sjdr.projeto.item;

import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.swing.JOptionPane;

import br.com.sjdr.projeto.inicio.Console;

import br.com.sjdr.projeto.inicio.Util;
import br.com.sjdr.projeto.menu.MenuLoogin;
import br.com.sjdr.projeto.menu.MenusItem;
import br.com.sjdr.projeto.persistencia.PersistirFornecedor;
import br.com.sjdr.projeto.persistencia.Persistir_Estoque;
import br.com.sjdr.projeto.pessoa.Fornecedor;

/**
 * Classe referente aos itens. Nela s�o guardadas informa��es em atributos como
 * o nome do item, pre�o, quantidade, c�digo, etc. Possui m�todos que podem
 * buscar, cadastrar, excluir e listar itens.
 */
public class Item implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private int codigo;

	private int quantidadeporcliente;

	private int quantidade;

	private String nomeItem;

	private String nomeFornecedorItem;

	private float margemLucro;

	private static float precoCusto;

	private float precoFinal;

	private static int saida;

	private String nomes;

	private int quantidadeEntrada;

	private float precoEntrada;

	private String data;

	private double precoAcumulado;

	public float getPrecoEntrada() {
		return precoEntrada;
	}

	public void setPrecoEntrada(float precoEntrada) {
		this.precoEntrada = precoEntrada;
	}

	public String getNomes() {
		return nomes;
	}

	public void setNomes(String nomes) {
		this.nomes = nomes;
	}

	public static Item getIt() {
		return it;
	}

	public static void setIt(Item it) {
		Item.it = it;
	}

	public String getNomeFornecedorItem() {
		return nomeFornecedorItem;
	}

	public int getSaida() {
		return saida;
	}

	public void setQuantidade(int quantidade) {
		this.quantidade = quantidade;
	}

	public void setNomeItem(String nomeItem) {
		this.nomeItem = nomeItem;
	}

	public void setMargemLucro(float margemLucro) {
		this.margemLucro = margemLucro;
	}

	public void setPrecoCusto(float precoCusto) {
		Item.precoCusto = precoCusto;
	}

	public void setPrecoFinal(float precoFinal) {
		this.precoFinal = precoFinal;
	}

	public void setQuantidadeEntrada(int quantidadeEntrada) {
		this.quantidadeEntrada = quantidadeEntrada;
	}

	public void setData(String data) {
		this.data = data;
	}

	public void setQuantidadeporcliente(int quantidadeporcliente) {
		this.quantidadeporcliente = quantidadeporcliente;
	}

	public int getQuantidadeporcliente() {
		return quantidadeporcliente;
	}

	public int getQuantidadeEntrada() {
		return quantidadeEntrada;
	}

	public String getData() {
		return data;
	}

	private static Item it;

	static SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm");

	static Imprimir est = new Imprimir();

	public String getNomeItem() {
		return nomeItem;
	}

	public int getCogigo() {
		return codigo;
	}

	public int getQuantidade() {
		return quantidade;
	}

	public float getMargemLucro() {
		return margemLucro;
	}

	public static float getPrecoCusto() {
		return precoCusto;
	}

	public float getPrecoFinal() {
		return precoFinal;
	}

	public String getNomeFornecedor() {
		return nomeFornecedorItem;
	}

	public void setNomeFornecedor(String nomeFornecedor) {
		this.nomeFornecedorItem = nomeFornecedor;

	}

	public void setPrecoAcumulado(double d) {
		this.precoAcumulado = d;
	}

	public double getPrecoAcumulado() {
		return precoAcumulado;
	}

	// Metodos proprios /////////////////////////////////////////

	/**
	 * M�todo respons�vel por buscar no vetor estoquelist um nome referente a um
	 * item. Caso ele encontre ser� exibido na tela o nome do item com seu
	 * c�digo e quantidade em estoque. Caso n�o encontre, retorna uma mensagem
	 * de erro.
	 */
	public static Item buscaPorNome() { // busca itens por nome
		System.out.println("Digite o Nome do Item para verificar no estoque");
		String x = Console.readString();
		for (int i = 0; i < Persistir_Estoque.estoquelist.size(); i++) {
			// A função aceita compara independente de case sensitive
			if (Persistir_Estoque.estoquelist.get(i).getNomeItem()
					.equalsIgnoreCase(x)) {
				System.out.println("item encontrado\n");
				System.out.println("\n nome do item       --> "
						+ Persistir_Estoque.estoquelist.get(i).getNomeItem());
				System.out.println("codigo do item        --> "
						+ Persistir_Estoque.estoquelist.get(i).getCogigo());
				System.out.println("Quantidade em estoque --> "
						+ Persistir_Estoque.estoquelist.get(i).getQuantidade());
				System.out.println("Preco Final           --> "
						+ Persistir_Estoque.estoquelist.get(i).getPrecoFinal());
				System.out.println("\n");
				Util.waitEnter();
				saida = 1;
				return Persistir_Estoque.estoquelist.get(i);
			}
		}
		if (saida != 1) {
			System.out
					.println("O item nao esta cadastrado 'confira o Nome ou Busque pelo codigo'");
			Util.waitEnter();
			saida = 0;
		}
		return null;
	}

	/**
	 * M�todo respons�vel por buscar no vetor estoquelist um c�digo referente a
	 * um item. Caso ele encontre ser� exibido na tela o nome do item com seu
	 * c�digo e quantidade em estoque. Caso n�o encontre, retorna uma mensagem
	 * de erro.
	 */
	public static Item buscaPorCodigo() { // busca itens por codigo
		System.out.println("Digite o codigo para verificar no estoque");
		int x = Console.readInteger();
		for (int i = 0; i < Persistir_Estoque.estoquelist.size(); i++) {

			if (Persistir_Estoque.estoquelist.get(i).getCogigo() == x) {
				System.out.println("Item encontrado\n");
				System.out.println("\n nome do item       --> "
						+ Persistir_Estoque.estoquelist.get(i).getNomeItem());
				System.out.println("codigo do item        --> "
						+ Persistir_Estoque.estoquelist.get(i).getCogigo());
				System.out.println("Quantidade em estoque --> "
						+ Persistir_Estoque.estoquelist.get(i).getQuantidade());
				System.out.println("Preco Final           --> "
						+ Persistir_Estoque.estoquelist.get(i).getPrecoFinal());
				System.out.println("\n");
				Util.waitEnter();
				saida = 1;
				return Persistir_Estoque.estoquelist.get(i);

			}
		}
		if (saida != 1) {
			System.out
					.println("O item nao esta cadastrado 'confira o codigo ou busque pelo nome'");
			Util.waitEnter();
			saida = 0;
		}
		return null;
	}

	public static void relacinadoInsercaoIten() { // cadastrar novos itens

		int sm = Integer
				.parseInt(JOptionPane
						.showInputDialog(null,
								"1 - Para inserir com  Fornecedor\n\n2 - Para inserir sem  Fornecedor\n\n"));

		if (sm == 3) {

			Item.menuItem();
		}

		if (sm == 2) {
			Fornecedor f1 = new Fornecedor();

			// System.out
			// .println("Digite o codigo do item, para verificacao caso ele ja esteja cadastrado");
			// int codigo = Console.readInteger();
			String cod = JOptionPane
					.showInputDialog(null,
							"Digite o Codigo do Item \n\n para verificar se ele ja esta cadatrado");
			int codigo = Integer.parseInt(cod);

			int k = 1;

			insertNovosItens(f1, codigo, k);

		}

		if (sm == 1) {

			int j = 0;
//			j = Fornecedor.buscarFornecedor();

			if (j != -1) {
				Fornecedor f1 = new Fornecedor();
				f1 = PersistirFornecedor.fornecedorlist.get(j);

				// System.out
				// .println("Digite o codigo do item, para verificacao caso ele ja esteja cadastrado");
				String cod = JOptionPane
						.showInputDialog(null,
								"Digite o Codigo do Item \n\n para verificar se ele ja esta cadatrado");
				int codigo = Integer.parseInt(cod);

				// int codigo = Console.readInteger();
				for (int i = 0; i < Persistir_Estoque.estoquelist.size(); i++) {
					saida = alteraQuantidadedeItensEstoque(codigo, i,
							f1.getNome());
				}
				insertNovosItens(f1, codigo, 0); // Caso o codigo do item nao
				// esteja
				// cadastrado, insere um novo item
			}
		}
	}

	/**
	 * M�todo respons�vel por mostrar um menu para cadastro de itens. Nele �
	 * poss�vel utilizar m�todos que cadastram itens com a exist�ncia ou n�o de
	 * um fornecedor.
	 */
	@SuppressWarnings("unused")
	private static int sumMenuCadstroItens() {

		return MenusItem.menuCadastroItens();
	}

	/**
	 * M�todo respons�vel pela inser��o de novos itens. Nele voc� informa o nome
	 * do item seguido do n�mero de itens, o pre�o de custo, margem de lucro
	 * calculando o pre�o final do produto e salvando todos os dados apartir de
	 * m�todos da classe de persist�ncia.
	 * 
	 * @param f1
	 * @param cod
	 * @param k
	 */
	public static void insertNovosItens(Fornecedor f1, int cod, int k) { // insere
		// novos
		// itens
		if (saida != 1) {

			it = new Item();
			it.setNomeFornecedor(f1.getNome());
			String temp;
			do {
				// System.out
				// .println("\n\nDigite o Nome do Item e a ser inserido e depois ENTER");
				// temp = Console.readString();
				temp = JOptionPane.showInputDialog(null,
						"Digite o Nome do Item \n\n para efetuar o cadastro");
			} while (temp.equals(""));
			it.nomeItem = temp;
			it.codigo = cod;
			it.quantidade = 0;
			it.precoFinal = 0;
			it.precoEntrada = 0;
			it.margemLucro = 0;
			it.setPrecoCusto(0);

			if (k != 1) {
				do {
					// System.out
					// .println("\n\nDigite o numero de itens a ser inseridor");

					String qI = JOptionPane.showInputDialog(null,
							"\n\nDigite o numero de itens a ser inserido");
					it.quantidade = Integer.parseInt(qI);
				} while ((it.getQuantidade() == 0));
				do {
					// System.out
					// .println("\n\nDigite o preco de custo passado pelo Fornecedor");
					String pF = JOptionPane
							.showInputDialog(null,
									"\n\nDigite o preco de custo passado pelo Fornecedor");
					Item.precoCusto = Float.parseFloat(pF);
				} while ((Item.getPrecoCusto() == 0));

				do {
					// System.out
					// .println("\n\nDigite a margem de lucro sem o sinal de porcentagem");
					String mL = JOptionPane
							.showInputDialog(null,
									"\n\nDigite a margem de lucro sem o sinal de porcentagem");
					it.margemLucro = Float.parseFloat(mL);
				} while ((it.getMargemLucro() == 0));

				it.precoFinal = (((it.margemLucro / 100) * getPrecoCusto()) + Item.precoCusto);
				System.out.println("O preco unitario Final do produto     --> "
						+ it.precoFinal);
				System.out.println("O preco unitario de custo do produto  --> "
						+ Item.precoCusto);
				it.quantidadeEntrada = it.getQuantidade();
				it.precoEntrada = Item.precoCusto;
			}
			it.data = sdf.format(new Date());
			Persistir_Estoque.persisteItemEstoqueList(it);
			Persistir_Estoque.persisteItemHistoricoCompras(it);
		}
		saida = 0;
	}

	public void setCogigo(int cogigo) {
		this.codigo = cogigo;
	}

	public void setNomeFornecedorItem(String nomeFornecedorItem) {
		this.nomeFornecedorItem = nomeFornecedorItem;
	}

	public void setSaida(int saida) {
		Item.saida = saida;
	}

	/**
	 * M�todo respons�vel por alterar a quantidade de itens de um determinado
	 * item no estoque.
	 * 
	 * @param codigo
	 * @param i
	 * @param nome
	 * @return
	 */
	public static int alteraQuantidadedeItensEstoque(int codigo, int i,
			String nome) {
		if (Persistir_Estoque.estoquelist.get(i).getCogigo() == codigo) {
			/*
			 * System.out.println("codigo ja exitente "); System.out
			 * .println("Deseja aumentar a quantidade do Item no estoque");
			 * System.out.println("\n nome do item       --> " +
			 * Persistir_Estoque.estoquelist.get(i).getNomeItem());
			 * System.out.println("\ncodigo do item      --> " +
			 * Persistir_Estoque.estoquelist.get(i).getCogigo()); System.out
			 * .println("Digite: \n -> 1 para sim qualquer tecla para nao");
			 */
			String qI = JOptionPane
					.showInputDialog(
							null,
							"\n\ncodigo ja exitente"
									+ "\nDeseja aumentar a quantidade do Item no estoque"
									+ "\n nome do item       -->"
									+ Persistir_Estoque.estoquelist.get(i)
											.getNomeItem()
									+ ""
									+ "\ncodigo do item      -->"
									+ Persistir_Estoque.estoquelist.get(i)
											.getCogigo()
									+ ""
									+ "\n\nDigite 1 para sim, 2 para n�o\n\nou cancele a opera��o..");

			int x = Integer.parseInt(qI);
			saida = 1;
			if (x == 1) {
				System.out.println("O item atual tem "
						+ Persistir_Estoque.estoquelist.get(i).getQuantidade()
						+ " em estoque, "
						+ "quantos a mais voce deseja adicionar?");

				String iA = JOptionPane.showInputDialog(null,
						"\n O item atual tem\n"
								+ ""
								+ Persistir_Estoque.estoquelist.get(i)
										.getQuantidade() + "em estoque"
								+ "\nquantos a mais voce deseja adicionar?");

				int z = Integer.parseInt(iA);
				System.out
						.println("Digite o preco de custo unitario dos novos itens");

				String pU = JOptionPane.showInputDialog(null,
						"\n Digite o preco de custo unitario dos novos itens");

				float y = Float.parseFloat(pU);

				System.out
						.println("A margem de Lucro atual e de -->"
								+ Persistir_Estoque.estoquelist.get(i)
										.getMargemLucro());

				System.out.println("Deseja alterar a margem de lucro");
				Item i2 = new Item();
				i2.nomeItem = Persistir_Estoque.estoquelist.get(i)
						.getNomeItem();
				i2.codigo = Persistir_Estoque.estoquelist.get(i).getCogigo();
				Item.precoCusto = y;
				i2.quantidade = z;
				i2.data = sdf.format(new Date());
				i2.nomeFornecedorItem = nome;
				i2.quantidadeEntrada = z;
				i2.precoEntrada = y;
				Persistir_Estoque.persisteItemHistoricoCompras(i2);
				Persistir_Estoque.estoquelist.get(i).quantidade = Persistir_Estoque.estoquelist
						.get(i).getQuantidade() + z;
				System.out.println("Digite 1 ou qualquer tecla para nao");

				String aM = JOptionPane
						.showInputDialog(
								null,
								"\n Deseja Alterra a marge de lucro"
										+ "\n 1 - para sim \n2 - para n�o ou cancele a opera��o"
										+ "\n\n a margem de lucro atual � de "
										+ Persistir_Estoque.estoquelist.get(i)
												.getMargemLucro());

				int mg = Integer.parseInt(aM);

				if (mg == 1) {

					System.out.println("\n\nDigite a nova margem de lucro");
					String mL = JOptionPane.showInputDialog(null,
							"\n\nDigite a nova margem de lucro"
									+ "\n sem o sinal de porcentagem");

					Persistir_Estoque.estoquelist.get(i).margemLucro = Integer
							.parseInt(mL);

					System.out.println("A marge de lucro atual e de  -->"
							+ Persistir_Estoque.estoquelist.get(i)
									.getMargemLucro());
				}
				Persistir_Estoque.estoquelist.get(i);
				float novopreco = ((Item.getPrecoCusto() * Persistir_Estoque.estoquelist
						.get(i).getQuantidade()) + (y * z))
						/ (z + Persistir_Estoque.estoquelist.get(i)
								.getQuantidade());
				Persistir_Estoque.estoquelist.get(i).precoFinal = (novopreco * (Persistir_Estoque.estoquelist
						.get(i).getMargemLucro() / 100)) + novopreco;
				Persistir_Estoque.estoquelist.get(i);
				Item.precoCusto = y;

				Persistir_Estoque.estoquelist.get(i);
				System.out.println("O preco de custo foi de            --> "
						+ Pedido.f.format(Item.getPrecoCusto()));
				System.out.println("O preco final foi alterado para    --> "
						+ Pedido.f.format(Persistir_Estoque.estoquelist.get(i)
								.getPrecoFinal()));

			}
		}
		return saida;
	}

	public static void pl() {
		System.out.println("\n\n");
	}

	/**
	 * M�todo respons�vel por mostrar um menu de itens. Nele � poss�vel acessar
	 * m�todos como cadastro de novos itens, impress�o de itens cadastrados,
	 * busca de itens por c�digo e nome e hist�rico de compras.
	 */
	public static void menuItem() {
		int valor;

		do {
			valor = MenusItem.menuItemPrincipal();
			switch (valor) {
			case 1:
				relacinadoInsercaoIten();
				break;
			case 2:
				Imprimir.imrpirmirItens();
				break;
			case 3:
				buscaPorCodigo();
				break;
			case 4:
				buscaPorNome();
				break;
			case 5:
				Imprimir.imrpirmirHcompras();
				break;
			case 6:
				MenuLoogin.menuAdm();
				break;
			default:
				System.out.println("Valor incompativel. Digite novamente.");
			}
		} while (valor != 6);
	}

}
